package com.zhuhjay.test;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;

/**
 * @author ZhuHJay
 * @date 2022/3/19 21:47
    ***************  需要以下 pom  *****************
    <!-- 模板引擎 -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.28</version>
        <scope>compile</scope>
    </dependency>
    <!-- mybatis-plus 生成器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!-- mybatis-plus starter 也需要有 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>
    <!-- slf4j日志 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>compile</scope>
    </dependency>
    <!-- 数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
 */
public class MybatisPlusGenerator {

    // 文件输出的路径
    private static final String outDirPath = "G:\\0Pro0Workspace\\LoggingSystem\\logging-system\\src\\main\\java";
    private static final String mysqlUrl = "jdbc:mysql:///system";
    private static final String username = "root";
    private static final String password = "root";

    public static void main(String[] args) throws Exception {
        FastAutoGenerator
                .create(getDataSourceConfig())
                .globalConfig(MybatisPlusGenerator::getGlobalConfig)
                .packageConfig(MybatisPlusGenerator::getPackageConfig)
                .strategyConfig(MybatisPlusGenerator::getStrategyConfig)
                .templateConfig(MybatisPlusGenerator::getTemplateConfig)
//                .injectionConfig(MybatisPlusGenerator::getInjectionConfig)
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }

    protected static DataSourceConfig.Builder getDataSourceConfig(){
        return new DataSourceConfig.Builder(mysqlUrl, username, password);
    }

//    protected static void getGlobalConfig(GlobalConfig.Builder builder){
//        builder.fileOverride() // 覆盖已生成文件
//                .outputDir("C:\\Users\\10067\\Desktop\\temp") // 指定输出目录
//                .author("zhuhjay") // 	作者名
////                .enableKotlin() // 开启 kotlin 模式
////                .enableSwagger() // 	开启 swagger 模式
//                .dateType(DateType.TIME_PACK) // 时间策略
//                .commentDate("yyyy-MM-dd") // 注释日期
//                .build();
//    }

    protected static void getGlobalConfig(Function<String, String> scanner, GlobalConfig.Builder builder){
        builder.fileOverride() // 覆盖已生成文件
                .outputDir(outDirPath) // 指定输出目录
                .author(scanner.apply("请输入作者名(存放文件注释中)")) // 	作者名
//                .enableKotlin() // 开启 kotlin 模式
//                .enableSwagger() // 开启 swagger 模式
                .dateType(DateType.ONLY_DATE) // 时间策略
                .commentDate("yyyy-MM-dd") // 注释日期
                .build();
    }

//    protected static void getPackageConfig(PackageConfig.Builder builder){
//        builder.parent("com.zhuhjay") // 父包名
//                .moduleName("system") // 父包模块名
//                .entity("domain") // Entity 包名
//                .service("service") // Service 包名
//                .serviceImpl("service.impl") // Service Impl 包名
//                .mapper("mapper") // Mapper 包名
//                .xml("mapper.xml") // Mapper XML 包名
//                .controller("controller") // Controller 包名
////                .other("other") // 自定义文件包名
//                .pathInfo(Collections.singletonMap(OutputFile.entity, "C:\\Users\\10067\\Desktop\\temp")) // 路径配置信息
//                .build();
//    }

    protected static void getPackageConfig(Function<String, String> scanner, PackageConfig.Builder builder){
        builder.parent(scanner.apply("请输入存放的父包名 eg: com.zhuhjay")) // 父包名
                .moduleName(scanner.apply("请输入存放的父包模块名 eg: system")) // 父包模块名
                .entity("domain") // Entity 包名
                .service("service") // Service 包名
                .serviceImpl("service.impl") // Service Impl 包名
                .mapper("mapper") // Mapper 包名
                .xml("mapper.xml") // Mapper XML 包名
                .controller("controller") // Controller 包名
                .other("other") // 自定义文件包名
                .pathInfo(Collections.singletonMap(OutputFile.entity, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.service, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.serviceImpl, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.mapper, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.xml, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.controller, outDirPath)) // 路径配置信息
                .pathInfo(Collections.singletonMap(OutputFile.other, outDirPath)) // 路径配置信息
                .build();
    }

    protected static void getTemplateConfig(TemplateConfig.Builder builder){
        builder.disable(TemplateType.ENTITY) // 禁用模板
                .entity("/templates/entity.java") // 设置实体模板路径(JAVA)
                .service("/templates/service.java") // 设置 service 模板路径
                .serviceImpl("/templates/serviceImpl.java") // 设置 serviceImpl 模板路径
                .mapper("/templates/mapper.java") // 设置 mapper 模板路径
                .controller("/templates/controller.java") // 设置 controller 模板路径
                .build();
    }

    protected static void getInjectionConfig(InjectionConfig.Builder builder){
        builder.beforeOutputFile((tableInfo, objectMap) -> {
                    System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                }) // 输出文件之前消费者
                .customMap(Collections.singletonMap("test", "baomidou")) // 自定义配置 Map 对象
                .customFile(Collections.singletonMap("test.txt", "/templates/test.vm")) // 自定义配置模板文件
                .build();
    }

//    protected static void getStrategyConfig(StrategyConfig.Builder builder){
//        builder.enableCapitalMode() // 	开启大写命名
//                .enableSkipView() // 开启跳过视图
//                .disableSqlFilter() // 禁用 sql 过滤
////                .likeTable(new LikeTable("USER")) // 模糊表匹配(sql 过滤)
//                .addInclude("user") // 增加表匹配(内存过滤)
////                .addTablePrefix("t_", "c_") // 增加过滤表前缀
////                .addFieldSuffix("_flag") // 增加过滤表后缀
//                .build();
//    }

    protected static void getStrategyConfig(Function<String, String> scanner, StrategyConfig.Builder builder){
        builder.enableCapitalMode() // 	开启大写命名
                .enableSkipView() // 开启跳过视图
                .disableSqlFilter() // 禁用 sql 过滤
//                .likeTable(new LikeTable("USER")) // 模糊表匹配(sql 过滤)
                .addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all"))) // 增加表匹配(内存过滤)
//                .addTablePrefix("t_", "c_") // 增加过滤表前缀
//                .addFieldSuffix("_flag") // 增加过滤表后缀
                .build();
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}
